package com.tianma315.core.tymenu.service.impl;

import com.alibaba.druid.proxy.jdbc.JdbcParameter;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.tianma315.core.common.base.CoreServiceImpl;
import com.tianma315.core.common.exception.MessageException;
import com.tianma315.core.constant.StateEnum;
import com.tianma315.core.procedures.domain.ProcedureLinkDO;
import com.tianma315.core.procedures.service.ProcedureLinkService;
import com.tianma315.core.tymenu.dao.TyMenuDao;
import com.tianma315.core.tymenu.domain.TyMenuDO;
import com.tianma315.core.tymenu.domain.TyMenuDataDO;
import com.tianma315.core.tymenu.domain.TyMenuDataVO;
import com.tianma315.core.tymenu.domain.TyMenuVO;
import com.tianma315.core.tymenu.service.TyMenuDataService;
import com.tianma315.core.tymenu.service.TyMenuService;

import com.tianma315.core.tymenu.vo.MenuSonVo;
import com.tianma315.core.wx.domain.CodeVo;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.*;

/**
 * 
 * <pre>
 * 溯源档案菜单(环节)
 * </pre>
 * <small> 2020-02-24 10:29:16 | Aron</small>
 */
@Service
public class TyMenuServiceImpl extends CoreServiceImpl<TyMenuDao, TyMenuDO> implements TyMenuService {

    @Autowired
    private TyMenuDataService tyMenuDataService;
    @Autowired
    private TyMenuDao tyMenuDao;
    @Autowired
    private ProcedureLinkService procedureLinkService;


    @Override
    public List<TyMenuVO> getTyMenuByTraceabilityFileId(Integer traceabilityFileId) {
        List<TyMenuVO> tyMenuVOList = new ArrayList<>();
        List<TyMenuVO> tyMenuSonList = new ArrayList<>();

        //查找属于该档案的所有环节信息
        EntityWrapper menuWrapper = new EntityWrapper();
        menuWrapper.eq("is_delete", StateEnum.not_del);
        menuWrapper.eq("traceability_file_id",traceabilityFileId);
        List<TyMenuDO> tyMenuDOS = selectList(menuWrapper);

        //根据环节menuId查找属于该环节的数据信息TyMenuData
        for (TyMenuDO tyMenu:tyMenuDOS){
            EntityWrapper menuDataWrapper = new EntityWrapper();
            menuDataWrapper.eq("is_delete",StateEnum.not_del);
            menuDataWrapper.eq("menu_id",tyMenu.getMenuId());
            List<TyMenuDataDO> tyMenuDataList = tyMenuDataService.selectList(menuDataWrapper);

            //将多张图片分割存储于pics集合
            List<TyMenuDataVO> listVo= new ArrayList<>();
            //将do换为Vo
            doToVo(tyMenuDataList, listVo);

            //将环节分出父环节与子环节
            TyMenuVO tyMenuVO = new TyMenuVO();
            tyMenuVO.setTyMenu(tyMenu);
            tyMenuVO.setTyMenuDataList(listVo);
            if (tyMenu.getMenuLevel()==0){
                tyMenuVOList.add(tyMenuVO);//获取所有的父目录
            }else {
                tyMenuSonList.add(tyMenuVO);//获取所有的子目录
            }
        }
        //遍历循环给父环节目录封装子环节目录
        for (TyMenuVO tyMenuVO : tyMenuVOList) {
            TyMenuDO tyMenu = tyMenuVO.getTyMenu();
            //判断该父环节是否有子环节
            if (tyMenu.getIsParent()==1){
                //封装多个子环节
                List<MenuSonVo> sonVos = new ArrayList<>();

                //封装多重sonVos子环节
                for (TyMenuVO menuVO : tyMenuSonList) {
                    Integer menuId = tyMenu.getMenuId();
                    TyMenuDO sonDo = menuVO.getTyMenu();
                    Integer parentMenuId = sonDo.getParentMenuId();
                    if (menuId.intValue() == parentMenuId.intValue()) {
                        if (sonVos.isEmpty()){
                            MenuSonVo menuSonVo = new MenuSonVo();
                            List<TyMenuVO> list = new ArrayList<>();
                            list.add(menuVO);
                            menuSonVo.setTyMenuSonList(list);
                            menuSonVo.setIsRep(sonDo.getIsRep());
                            menuSonVo.setMenuSonVal(sonDo.getMenuName());
                            sonVos.add(menuSonVo);
                        }else{
                            int i = 0;
                            for (MenuSonVo sonVo : sonVos) {
                               if (sonDo.getMenuName().equals(sonVo.getMenuSonVal())){
                                   i = 1;
                                   sonVo.getTyMenuSonList().add(menuVO);
                               }
                            }
                            //说明还没该子环节
                            if (i==0){
                                MenuSonVo menuSonVo = new MenuSonVo();
                                List<TyMenuVO> list = new ArrayList<>();
                                list.add(menuVO);
                                menuSonVo.setTyMenuSonList(list);
                                menuSonVo.setIsRep(sonDo.getIsRep());
                                menuSonVo.setMenuSonVal(sonDo.getMenuName());
                                sonVos.add(menuSonVo);
                            }
                        }
                    }
                }

                tyMenuVO.setSonVoList(sonVos);

            }
        }
        //返回已封装完整的父环节
        return tyMenuVOList;
    }

    private void doToVo(List<TyMenuDataDO> tyMenuDataList, List<TyMenuDataVO> listVo) {
        Iterator<TyMenuDataDO> iterator = tyMenuDataList.iterator();
        while (iterator.hasNext()) {
            TyMenuDataDO next = iterator.next();
            TyMenuDataVO tyMenuDataVO = new TyMenuDataVO();
            BeanUtils.copyProperties(next,tyMenuDataVO);
            if (next.getType()==1) {
                String[] split = next.getDataValue().split(",");
                tyMenuDataVO.setPics(Arrays.asList(split));
            }
            listVo.add(tyMenuDataVO);
        }
    }

    //查询可重复录入数据
    @Override
    public List<TyMenuVO> selectVOById(Integer traceabilityFileId, Integer procedureLinkId) {
        List<TyMenuVO>  list = tyMenuDao.selectVOById(traceabilityFileId,procedureLinkId);
        if (!list.isEmpty()){
            int i = 1;
            for (TyMenuVO tyMenuVO : list) {
                String menuName = tyMenuVO.getMenuName();
                tyMenuVO.setMenuName("第"+i+"次"+menuName);;
                i++;
            }
        }
        return list;
    }

    @Override
    public boolean addRepeat(TyMenuVO tyMenuVO) {
        Integer procedureLinkId = tyMenuVO.getProcedureLinkId();
        ProcedureLinkDO procedureLinkDO = procedureLinkService.selectById(procedureLinkId);

        TyMenuDO tyMenuDO = new TyMenuDO();
        //绑定父环节Id
        if(procedureLinkDO.getType()==1){
            Integer parentId = procedureLinkDO.getParentId();
            Wrapper<TyMenuDO> wrapper = new EntityWrapper<>();
            wrapper.eq("procedure_link_id",parentId).
                    eq("traceability_file_id",tyMenuVO.getTraceabilityFileId()).
                    eq("is_delete",0);
            TyMenuDO tyMenuDO1 = selectOne(wrapper);
            tyMenuDO.setParentMenuId(tyMenuDO1.getMenuId());
        }else {
            tyMenuDO.setParentMenuId(0);
        }
        tyMenuDO.setCreateDate(new Date());
        tyMenuDO.setCreateBy(tyMenuVO.getCreateBy());
        tyMenuDO.setMenuName(procedureLinkDO.getProcedureLinkName());
        tyMenuDO.setProcedureLinkId(procedureLinkId);
        tyMenuDO.setMenuLevel(procedureLinkDO.getType());
        tyMenuDO.setParentMenuId(0);
        tyMenuDO.setTraceabilityFileId(tyMenuVO.getTraceabilityFileId());
        tyMenuDO.setIsDelete(0);
        tyMenuDO.setIsRep(1);
        insert(tyMenuDO);

        String[][] keyValues = tyMenuVO.getKeyValues();
        //添加MenuData数据
        addMenuData(keyValues,tyMenuDO.getMenuId());

        return true;
    }

    private void addMenuData(String[][] keyValues,Integer menuId) {
        for (String[] strings : keyValues) {
            TyMenuDataDO tyMenuDataDO = new TyMenuDataDO();
            tyMenuDataDO.setCreateDate(new Date());
            tyMenuDataDO.setMenuId(menuId);
            tyMenuDataDO.setType(2);
            for (int i = 0; i < strings.length; i++) {
                if (i==0){
                    tyMenuDataDO.setDataKey(strings[i]);
                }else if (i==1){
                    tyMenuDataDO.setDataValue(strings[i]);
                }
               tyMenuDataDO.setIsDelete(0);
            }
            tyMenuDataService.insert(tyMenuDataDO);
        }
    }
    @Override
    public boolean updateStaById(Integer menuId) {
        TyMenuDO tyMenuDO = new TyMenuDO();
        tyMenuDO.setMenuId(menuId);
        tyMenuDO.setIsDelete(1);
        return updateById(tyMenuDO);
    }

    @Override
    public Integer addTyMenuDo(CodeVo codeVo , Long userId) {
        ProcedureLinkDO procedureLinkDO = procedureLinkService.selectById(codeVo.getProceduresLinkId());
        Integer traceabilityFileId = codeVo.getTraceabilityFileId();
        TyMenuDO tyMenuDO = new TyMenuDO();
        tyMenuDO.setCreateBy(userId);
        tyMenuDO.setCreateDate(Calendar.getInstance().getTime());
        tyMenuDO.setMenuName(procedureLinkDO.getProcedureLinkName());
        tyMenuDO.setMenuLevel(procedureLinkDO.getType());
        tyMenuDO.setParentMenuId(0);
        tyMenuDO.setTraceabilityFileId(traceabilityFileId);
        tyMenuDO.setProcedureLinkId(codeVo.getProceduresLinkId());

        //二级环节：自动添加父环节的菜单目录和 设置父目录Id
        if (procedureLinkDO.getType()==1){

            Integer parentId = procedureLinkDO.getParentId();
            Wrapper<TyMenuDO> wrapper = new EntityWrapper<>();
            wrapper.eq("procedure_link_id",parentId)
                    .eq("traceability_file_id",traceabilityFileId);
            List<TyMenuDO> tyMenuDOS = selectList(wrapper);
            //判断是否存在父菜单目录，没有就添加
            if (tyMenuDOS.isEmpty()){
                TyMenuDO fuMenuDO = new TyMenuDO();
                ProcedureLinkDO parentProcedureLinkDO = procedureLinkService.selectById(parentId);
                fuMenuDO.setCreateBy(userId);
                fuMenuDO.setCreateDate(Calendar.getInstance().getTime());
                fuMenuDO.setMenuName(parentProcedureLinkDO.getProcedureLinkName());
                fuMenuDO.setMenuLevel(0);
                fuMenuDO.setParentMenuId(0);
                fuMenuDO.setIsParent(1);
                fuMenuDO.setTraceabilityFileId(traceabilityFileId);
                fuMenuDO.setProcedureLinkId(parentId);
                insert(fuMenuDO);
                //获取并设置父上一级ID
                tyMenuDO.setParentMenuId(fuMenuDO.getMenuId());
            }else {
                tyMenuDO.setParentMenuId(tyMenuDOS.get(0).getMenuId());
            }
            tyMenuDO.setIsRep(procedureLinkDO.getIsRepeat());
        }
        if (insert(tyMenuDO)){
            new MessageException("添加环节目录失败");
        };
        return tyMenuDO.getMenuId();
    }
}
